// 认证服务 - 连接后端API
import axios from 'axios'
import config from '../config'

const API_BASE_URL = config.API_BASE_URL

// 创建axios实例
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  timeout: config.API_TIMEOUT,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 响应拦截器 - 处理错误
apiClient.interceptors.response.use(
  response => {
    return response.data
  },
  error => {
    console.error('Auth API Error:', error)
    
    // 提取后端返回的错误消息
    if (error.response?.data) {
      const errorData = error.response.data
      // 如果后端返回了结构化的错误响应，创建一个包含消息的错误
      if (errorData.message) {
        const errorMessage = new Error(errorData.message)
        errorMessage.response = error.response
        errorMessage.status = error.response.status
        errorMessage.code = errorData.code || error.response.status
        return Promise.reject(errorMessage)
      }
    }
    
    if (error.response?.status === 401) {
      // 未授权，清除token并跳转到登录页
      localStorage.removeItem('token')
      localStorage.removeItem('user_info')
      window.location.href = '/login'
    }
    return Promise.reject(error)
  }
)

export const AuthService = {
  // 登录
  async login(credentials) {
    try {
      // 构造登录请求数据
      const loginData = {
        username: credentials.username,
        password: credentials.password
      }
      
      console.log('🔍 发送登录请求:', loginData)
      console.log('🔍 API端点:', `${API_BASE_URL}/auth/login`)
      
      const response = await apiClient.post('/auth/login', loginData)
      
      console.log('🔍 后端响应:', response)
      console.log('🔍 响应类型:', typeof response)
      console.log('🔍 响应结构:', JSON.stringify(response, null, 2))
      
      // 后端返回格式: { success: true, message: "登录成功", data: { token: "...", user: {...} } }
      if (response.success && response.data) {
        const loginData = response.data
        
        console.log('🔍 登录响应数据:', loginData)
        
        // 提取token
        const token = loginData.token
        
        // 构建用户信息对象（后端返回的是扁平结构，需要重组）
        const user = {
          id: loginData.userId,           // 后端返回的是userId
          username: loginData.username,
          fullName: loginData.fullName,
          email: loginData.email,
          role: loginData.role
        }
        
        console.log('🔍 提取的token:', token)
        console.log('🔍 构建的user对象:', user)
        console.log('🔍 User ID:', user.id)
        
        // 验证必要字段
        if (!token) {
          throw new Error('登录响应中缺少token')
        }
        if (!user.id) {
          console.error('❌ 用户ID缺失！原始数据:', loginData)
          throw new Error('登录响应中缺少用户ID')
        }
        
        // 保存token和用户信息到localStorage
        localStorage.setItem('token', token)
        localStorage.setItem('user_info', JSON.stringify(user))
        
        console.log('✅ 登录成功，已保存到localStorage')
        console.log('✅ Token已保存')
        console.log('✅ User Info已保存:', JSON.stringify(user))
        
        return {
          token: token,
          user: user
        }
      } else {
        console.error('❌ 响应格式不正确:', response)
        throw new Error(response.message || '登录失败')
      }
    } catch (error) {
      console.error('❌ 登录失败:', error)
      console.error('❌ 错误详情:', error.response?.data)
      throw error
    }
  },


  // 注册
  async register(userData) {
    try {
      // 构造完整的注册请求数据
      const registerData = {
        username: userData.username,
        email: userData.email,
        password: userData.password,
        confirmPassword: userData.confirmPassword || userData.password, // 使用确认密码或密码
        fullName: userData.fullName || userData.username, // 如果没有提供真实姓名，使用用户名
        role: userData.role ? userData.role.toUpperCase() : 'CUSTOMER', // 转换为大写
        phone: userData.phone || '',
        department: userData.department || '',
        position: userData.position || '',
        employeeId: userData.employeeId || ''
      }
      
      console.log('🔍 发送注册请求:', registerData)
      console.log('🔍 API端点:', `${API_BASE_URL}/auth/register`)
      console.log('🔍 请求配置:', {
        baseURL: API_BASE_URL,
        timeout: config.API_TIMEOUT,
        headers: { 'Content-Type': 'application/json' }
      })
      
      const response = await apiClient.post('/auth/register', registerData)
      
      console.log('🔍 后端响应:', response)
      console.log('🔍 响应类型:', typeof response)
      console.log('🔍 响应结构:', JSON.stringify(response, null, 2))
      
      console.log('✅ 注册成功')
      return response
    } catch (error) {
      console.error('❌ 注册失败 - 详细错误信息:')
      console.error('❌ 错误对象:', error)
      console.error('❌ 错误类型:', typeof error)
      console.error('❌ 错误消息:', error.message)
      
      if (error.response) {
        // 服务器响应了错误状态码
        console.error('❌ HTTP状态码:', error.response.status)
        console.error('❌ HTTP状态文本:', error.response.statusText)
        console.error('❌ 响应头:', error.response.headers)
        console.error('❌ 响应数据:', error.response.data)
        console.error('❌ 响应数据类型:', typeof error.response.data)
        console.error('❌ 响应数据JSON:', JSON.stringify(error.response.data, null, 2))
      } else if (error.request) {
        // 请求已发出但没有收到响应
        console.error('❌ 请求配置:', error.config)
        console.error('❌ 请求数据:', error.request)
        console.error('❌ 网络错误 - 无法连接到服务器')
      } else {
        // 其他错误
        console.error('❌ 其他错误:', error.message)
      }
      
      // 构造更详细的错误信息
      let errorMessage = '注册失败'
      if (error.response?.data?.message) {
        errorMessage = error.response.data.message
      } else if (error.response?.data?.error) {
        errorMessage = error.response.data.error
      } else if (error.message) {
        errorMessage = error.message
      }
      
      // 添加状态码信息
      if (error.response?.status) {
        errorMessage += ` (状态码: ${error.response.status})`
      }
      
      const detailedError = new Error(errorMessage)
      detailedError.status = error.response?.status
      detailedError.response = error.response?.data
      detailedError.originalError = error
      
      throw detailedError
    }
  },


  // 登出
  logout() {
    localStorage.removeItem('token')
    localStorage.removeItem('user_info')
  },

  // 获取当前用户信息
  getCurrentUser() {
    try {
      const userInfo = localStorage.getItem('user_info')
      if (!userInfo || userInfo === 'undefined' || userInfo === 'null') {
        return null
      }
      return JSON.parse(userInfo)
    } catch (error) {
      console.error('获取用户信息失败:', error)
      // 清除无效的用户信息
      localStorage.removeItem('user_info')
      localStorage.removeItem('token')
      return null
    }
  },

  // 获取token
  getToken() {
    return localStorage.getItem('token')
  },

  // 检查是否已登录
  isAuthenticated() {
    const token = this.getToken()
    const user = this.getCurrentUser()
    return !!(token && user)
  },

  // 刷新token（如果需要）
  async refreshToken() {
    try {
      const response = await apiClient.post('/auth/refresh')
      if (response.code === 0 && response.data && response.data.token) {
        localStorage.setItem('token', response.data.token)
        localStorage.setItem('user_info', JSON.stringify(response.data.user))
        console.log('✅ Token刷新成功')
        return response.data
      } else {
        throw new Error(response.message || 'Token刷新失败')
      }
    } catch (error) {
      console.error('❌ 刷新token失败:', error)
      this.logout()
      throw error
    }
  },

  // 强制重新登录
  async forceReLogin() {
    console.log('🔄 强制重新登录...')
    this.logout()
    
    // 清除所有相关存储
    localStorage.removeItem('token')
    localStorage.removeItem('user_info')
    localStorage.removeItem('auth')
    
    // 跳转到登录页
    window.location.href = '/login'
  },

  // 检查token有效性
  isTokenValid() {
    const token = this.getToken()
    if (!token) return false
    
    try {
      // 简单的token格式检查
      const parts = token.split('.')
      if (parts.length !== 3) return false
      
      // 检查token是否过期（简单检查）
      const payload = JSON.parse(atob(parts[1]))
      const now = Math.floor(Date.now() / 1000)
      
      if (payload.exp && payload.exp < now) {
        console.log('⚠️ Token已过期')
        return false
      }
      
      return true
    } catch (error) {
      console.error('Token验证失败:', error)
      return false
    }
  }
}
